#include "memory/at24c32.h"
#include <stddef.h>

/**
 * @brief 设置即将操作的地址
 * @param address 指定要写入的地址
 * @return int 返回程序执行的状态
 */
int at24c32_set_current_address(at24c32_t* eeprom, uint16_t address)
{
	return eeprom->ops.i2c_write(eeprom->cfg.fix.device_address, &address, NULL, 0);
}

/**
 * @brief 在指定的地址写一个字节
 * @param address 指定要写入的地址
 * @param buffer 要写入数据的数据缓存区
 * @return int 返回程序执行的状态
 */
int at24c32_byte_write(at24c32_t* eeprom, uint16_t address, uint8_t* buffer)
{
	return eeprom->ops.i2c_write(eeprom->cfg.fix.device_address, &address, buffer, 1);
}

/**
 * @brief 在指定的地址连续写入字节
 * @param address 指定要写入的首地址
 * @param buffer 要写入数据的数据缓存区
 * @param length 指定要写入的字节个数, 单次最多写入8字节数据
 * @return int 返回程序执行的状态
 * @note 此函数为页写入函数, 对于at24c32一页为8个字节, 写入地址要求为页首地址
 */
int at24c32_page_write(at24c32_t* eeprom, uint16_t address, uint8_t* buffer, uint8_t length)
{
	if ((length <= 0) || (length > 32)) {
		return -1;
	}

	return eeprom->ops.i2c_write(eeprom->cfg.fix.device_address, &address, buffer, length);
}

/**
 * @brief 直接读取当前地址的内容，读一个字节
 * @param buffer 保存读取到的数据的缓存区
 * @return int 返回程序执行的状态
 */
int at24c32_current_address_read(at24c32_t* eeprom, uint8_t* buffer)
{
	return eeprom->ops.i2c_read(eeprom->cfg.fix.device_address, NULL, buffer, 1);
}

/**
 * @brief 在指定的地址读取一个字节
 * @param address 指定要读取的首地址
 * @param buffer 保存读取到的数据的缓存区
 * @return int 返回程序执行的状态
 */
int at24c32_random_read(at24c32_t* eeprom, uint16_t address, uint8_t* buffer)
{
	return eeprom->ops.i2c_read(eeprom->cfg.fix.device_address, &address, buffer, 1);
}

/**
 * @brief 从当前地址读取一片连续的字节
 * @param address 指定要读取的首地址
 * @param buffer 保存读取到的数据的缓存区
 * @return uint8_t 返回程序执行的状态
 */
int at24c32_sequential_read(at24c32_t* eeprom, uint8_t* buffer, uint16_t length)
{
	return eeprom->ops.i2c_read(eeprom->cfg.fix.device_address, NULL, buffer, length);
}

